﻿
using System;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

using System.Collections.Generic;
using Osiptel.CCPP.BE;
using Osiptel.CCPP.BL;

using System.DirectoryServices;
using System.Web.SessionState;

using Osiptel.CCPP.UTIL;


public partial class FrmLogin : System.Web.UI.Page
{

    #region "metodos"

    protected void btnLogin_Click(object sender, EventArgs e)
    {
        String strUsuario = txtUsuario.Text.Trim().ToLower();
        String strContrasenia = txtClave.Text.Trim();
        String strError = String.Empty;
        UsuarioBE objUsu = new UsuarioBE();
        String lsIDUsuario = String.Empty;
        //Int32 vflagmodclave;
        //Int32 vnumintentos;

        //vnumintentos = Convert.ToInt32(ViewState["Intentos"].ToString());
        //vnumintentos += 1;
        //ViewState["Intentos"] = vnumintentos;

        //if (Convert.ToInt32(ViewState["Intentos"].ToString()) > 2)
        //{
        //    //this.btnAceptar.Enabled = false;
        //    //this.btnSalir.Enabled = false;
        //    //lblMensaje.Text = "Ud. agoto los intentos para ingresar al " + ConfigurationManager.AppSettings["NombreSistema"].ToString() + ", por favor intentelo mas tarde";
        //    //lblMensaje.Visible = true;
        //}

        string caracter = strUsuario.Substring(0, 3).ToLower();
        //strError = "";
        if (caracter != "eo_")
        {
            strError = ""; // validaLDAP(strUsuario, strContrasenia);

            if (strError.Length != 0)
            {
                lblMsg.Text = strError;
                return;
            }

            using (UsuarioBL objBLUsuario = new UsuarioBL())
            {
                UsuarioBE objBEUsuario = new UsuarioBE();
                objBEUsuario.IdUsuario = strUsuario;
                objBEUsuario.Clave = strContrasenia;
                lsIDUsuario = objBLUsuario.Validar(strUsuario).ToString();

                if (lsIDUsuario == "0")
                {
                    lblMsg.Text = "Usuario no válido";
                    return;
                }

                objBEUsuario = objBLUsuario.Obtener(strUsuario);
                if (objBEUsuario == null)
                {
                    lblMsg.Text = "Usuario no válido";
                    return;
                }

                if (objBEUsuario.IdUsuario.ToUpper() != strUsuario.ToUpper())
                {
                    lblMsg.Text = "Usuario no válido";
                    txtUsuario.Focus();
                    return;
                }
                else
                {
                    try
                    {
                        DataTable dtPerfilUser = objBLUsuario.ObtenerIdPerfil("HECO", Convert.ToString(objBEUsuario.IdUsuario));
                        Session["UsuarioSistema"] = objBEUsuario;
                        Session["IdUsuario"] = Convert.ToString(objBEUsuario.IdUsuario);
                        Session["PerfilUsuario"] = dtPerfilUser.Rows[0]["IDPERFIL"];
                        Session["cod_Empresa"] = "-1";
                        Session["NombEmpresa"] = "OSIPTEL";
                        Session["mail_Empresa"] = "";
                        Session["DescripcionPerfil"] = Convert.ToString(dtPerfilUser.Rows[0]["DESCRIPCION"]);

                        RegistrarVisitas();
                        Response.Redirect("FrmInicio.aspx");


                    }catch (Exception ex){
                        lblMsg.Text = ex.ToString();// "El usuario no tiene un perfil de acceso asociado";
                    }
                }
            }

        }
        else
        {

            strError = validaLDAP(strUsuario, strContrasenia);

            if (strError.Length != 0)
            {
                lblMsg.Text = strError;
                return;
            }

            using (UsuarioBL objBLUsuario = new UsuarioBL())
            {
                UsuarioBE objBEUsuario = new UsuarioBE();
                objBEUsuario.IdUsuario = strUsuario;
                objBEUsuario.Clave = strContrasenia;
                lsIDUsuario = objBLUsuario.ValidarUsuEO(strUsuario, UTFunciones.SHA1Encrypt(strContrasenia)).ToString();
                if (lsIDUsuario == "0")
                {
                    lblMsg.Text = "Usuario no válido";
                    return;
                }

                DataTable dt = objBLUsuario.ObtenerUsuEO(objBEUsuario.IdUsuario);
                if (dt.Rows.Count == 0)
                {
                    lblMsg.Text = "Usuario no válido";
                    return;
                }

                try
                {
                    DataTable dtPerfilUser = objBLUsuario.ObtenerIdPerfil("XXXX", Convert.ToString(objBEUsuario.IdUsuario));
                    objBEUsuario.Nombres = dt.Rows[0]["NOMBRE"].ToString() + ", " + dt.Rows[0]["APEPAT"].ToString() + " " + dt.Rows[0]["APEMAT"].ToString();

                    Session["IdUsuario"] = Convert.ToString(objBEUsuario.IdUsuario);
                    Session["PerfilUsuario"] = dtPerfilUser.Rows[0]["IDPERFIL"];
                    Session["cod_Empresa"] = dt.Rows[0]["IDEMPRESA"].ToString();
                    Session["mail_Empresa"] = dt.Rows[0]["EMAILPERS"].ToString();

                    Session["NombEmpresa"] = "OSIPTEL";
                    Session["Documento"] = dt.Rows[0]["NRODOC"].ToString();
                    objBEUsuario.Cod_Empresa = Convert.ToInt32(Session["cod_Empresa"]);
                    Session["UsuarioSistema"] = objBEUsuario;
                    Session["DescripcionPerfil"] = Convert.ToString(dtPerfilUser.Rows[0]["DESCRIPCION"]);
                    RegistrarVisitas();
                    Response.Redirect("Inicio.aspx");
                    //FormsAuthentication.RedirectFromLoginPage(txtUsuario.Text, false);
                }
                catch (Exception)
                {
                    //alertScript("alert('¡Los datos ingresados son incorrectos!')");
                }
            }
        }
    }

    private void RegistrarVisitas()
    {
        using (IndicadorBL objIndicadorBL = new IndicadorBL())
        {
            IndicadorBE objIndicadorBE = new IndicadorBE();
            objIndicadorBE.aplicacion = "HECO";
            objIndicadorBE.tipo = "VISI_HECO";
            objIndicadorBE.usuario = (String)((HttpSessionState)HttpContext.Current.Session)["IdUsuario"];
            objIndicadorBE.ip = Request.UserHostAddress; //Request.Servervariables("REMOTE_ADDR");
            objIndicadorBL.mInsertarIndicador(objIndicadorBE);
            Session["SessVisita"] = objIndicadorBL.ObtenerVisita(objIndicadorBE);
            DataTable dtFecUltVisi = new DataTable();
            dtFecUltVisi = objIndicadorBL.ObtenerFecha(objIndicadorBE);
            string fecha = dtFecUltVisi.Rows[0][0].ToString();
            Session["SessFecUltVisita"] = fecha;
        }
    }

    private String validaLDAP(String username, String pwd)
    {
        //Este namespace que nos da acceso al Active Directory tiene dos clases 
        //que utilizaremos para acceder a los datos de un usuario:
        //DirectoryEntry. Esta clase proporciona una conexión al Active Directory conteniendo los hijos del Active Directory.
        //DirectorySearcher. Esta clase realiza busquedas dentro del Active Directory.

        //Este ejemplo podeis incluirlo en cualquier método, clase o donde queráis utilizarlo.
        //Primero acotamos los varoles de busqueda y la ruta del Active Directoy, en nuestro caso buscaremos datos del usuario “pruebas01” en el Active Directory de mws.com.

        Funciones objFunciones;

        try
        {
            //  string strPath = "LDAP://srvdc/DC=osiptel,DC=gob,DC=pe";
            objFunciones = new Funciones();
            String strPath = objFunciones.ObtenerLDAP();
            string strDomain = "osiptel";
            string domainAndUsername = strDomain + @"\" + username;

            //Si deseas listar todos los grupos de AD debes usar el siguiente FILTRO search.Filter = "(OU=Groups)" 

            //Creamos una entra al Active Directory que devolverá el árbol en la variable entry.
            DirectoryEntry entry = new DirectoryEntry(strPath, domainAndUsername, pwd);

            //Realizamos una busqueda sobre la entrada anteriormente seleccionada.    
            DirectorySearcher search = new DirectorySearcher(entry);

            //Filtramos el usuario del que queremos obtener los datos.
            search.Filter = "name=" + username;

            //Y realizamos una busqueda de todos sus datos.
            SearchResultCollection results = search.FindAll();

            //El resultado de la busqueda se guarda en un colección SearchResultCollection. 
            //Recorriendo esta colección encontraremos sus propiedades.
            foreach (SearchResult resultados in results)
            {

                //Creamos una variable para almacenar las propiedades, 
                //que será una colección de propiedades, ResultPropertyCollection.

                ResultPropertyCollection colProperties = resultados.Properties;

                //Y recorremos dicha colección, en el campo Key 
                //obtendremos el nombre de la propiedad y en el campo value el valor de dicha propiedad.   
                String ls = String.Empty;
                foreach (string key in colProperties.PropertyNames)
                {
                    foreach (object value in colProperties[key])
                    {
                        ls = ls + "" + key.ToString() + ": " + value + "";
                    }
                }
            }
        }
        catch (Exception ex)
        {
            return ex.Message.ToString();
        }
        return "";
    }

    #endregion


}